package com.example.ai.tools;

import cn.hutool.json.JSONUtil;
import com.example.ai.entity.Good;
import com.example.ai.entity.Order;
import com.example.ai.entity.User;
import com.example.ai.entity.item;
import com.example.ai.service.goodService;
import com.example.ai.service.orderService;
import com.example.ai.service.userService;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 无爱工具服务类
 * 封装业务查询和下单操作的工具方法，提供对外服务接口
 *
 * @author czwa
 */
@Slf4j
@Component("WuAiTools")
public class WuAiTools {

    @Autowired
    private orderService orderService;    // 订单服务注入
    @Autowired
    private goodService goodservice;      // 商品服务注入
    @Autowired
    private userService userService;      // 用户服务注入

    /**
     * 订单信息查询工具方法
     *
     * @param orderId 订单ID（字符串类型，需转为整数）
     * @return 订单信息字符串，若不存在则提示"订单不存在"
     */
    @Tool(name = "订单信息查询", value = "根据订单id查询指定订单信息,若返回为空给出提示不存在该订单")
    public String getOrderInfo(
            @P(value = "orderId") String orderId
    ) {
        try {
            // 转换订单ID为整数并查询订单
            Order byId = orderService.getById(Integer.parseInt(orderId));
            return byId != null ? byId.toString() : "订单不存在";
        } catch (NumberFormatException e) {
            log.error("订单ID格式错误: {}", orderId, e);
            return "订单ID格式错误，请输入数字";
        }
    }

    /**
     * 商品信息查询工具方法
     *
     * @param name        商品名称（可选参数）
     * @param minPrice    最低价格（可选参数）
     * @param maxPrice    最高价格（可选参数）
     * @param supplyName  供应商名称（可选参数）
     * @return 商品信息列表字符串，过滤库存为0的商品，不展示库存字段
     */
    @Tool(name = "商品信息查询", value = "根据参数查询商品信息,最多展示十条数据，如果用户要求超过十条，请求用户自己前往下单界面查看,向用户展示时不展示没有库存的，展示时不能展示库存数")
    public String getGoodInfo(
            @P(value = "name", required = false) String name,
            @P(value = "minPrice", required = false) Integer minPrice,
            @P(value = "maxPrice", required = false) Integer maxPrice,
            @P(value = "supplyName", required = false) String supplyName
    ) {
        log.info("调用商品信息查询方法，参数：name={}, minPrice={}, maxPrice={}, supplyName={}",
                name, minPrice, maxPrice, supplyName);

        // 构建查询条件对象
        Good good = new Good();
        good.setName(name);
        good.setMinPrice(minPrice);
        good.setMaxPrice(maxPrice);
        good.setSupplyName(supplyName);
        good.setPage(1);
        good.setPageSize(10);  // 固定返回10条数据

        // 调用服务查询商品列表并过滤库存为0的商品
        List<Good> goods = goodservice.getAllGoods(good);
        goods.removeIf(g -> g.getStock() <= 0);  // 过滤无库存商品

        // 构建返回结果（不包含库存字段）
        return goods.stream()
                .map(g -> "商品ID: " + g.getId() +
                        ", 名称: " + g.getName() +
                        ", 价格: " + g.getPrice() +
                        ", 供应商: " + g.getSupplyName())
                .collect(Collectors.joining("\n"));
    }

    /**
     * 用户信息查询工具方法
     *
     * @param username 用户名（可选参数）
     * @param gender   性别（可选参数）
     * @param phone    手机号（可选参数）
     * @return 用户信息列表字符串，过滤敏感字段（如密码），最多展示10条
     */
    @Tool(name = "用户信息查询", value = "根据参数查询用户信息，最多展示十条数据，不展示密码等敏感数据，如果用户要求超过十条，请求用户前往管理界面查看")
    public String getUserInfo(
            @P(value = "userName", required = false) String username,
            @P(value = "gender", required = false) Integer gender,
            @P(value = "phone", required = false) String phone
    ) {
        // 构建查询条件对象
        User user = new User();
        user.setPage(1);
        user.setPageSize(10);  // 固定返回10条数据

        // 设置可选查询条件
        if (username != null) user.setUserName(username);
        if (gender != null) user.setGender(gender);
        if (phone != null) user.setPhone(phone);

        // 调用服务查询用户列表并过滤敏感信息
        List<User> users = userService.getAllUsers(user);
        return users.stream()
                .map(u -> "用户ID: " + u.getId() +
                        ", 用户名: " + u.getUserName() +
                        ", 性别: " + (u.getGender() == 1 ? "男" : (u.getGender() == 2 ? "女" : "未知")) +
                        ", 手机号: " + u.getPhone() +
                        ", 状态: " + (u.getStatus() == 1 ? "启用" : "禁用"))
                .collect(Collectors.joining("\n"));
    }

    /**
     * 帮助用户下单工具方法
     *
     * @param items 订单商品项数组（包含商品名称和数量）
     * @return 下单结果提示（成功或失败原因）
     */
    @Tool(name = "帮助用户下单", value = "根据用户的下单要求（商品名称,商品数量），直接帮助用户进行下单的操作，如果用户提供的参数不对，给出规范，直接下单即可")
    public String addOrder(
            @P(value = "items") item[] items
    ) {
        // 校验参数合法性
        if (items == null || items.length == 0) {
            return "下单失败：请提供商品信息";
        }
        for (item i : items) {
            if (i.getGoodName() == null || i.getQuantity() <= 0) {
                return "下单失败：商品名称和数量为必填项";
            }
        }

        // 调用服务执行下单流程
        return orderService.autoAddOrder(items);
    }
}